package com.sakura.hk.sakura.springboot.plugin.tool;

import java.util.Date;

/**
 * 生成java 字符串工具
 *
 * @Author: 贺坤
 * @Date: 2021/7/15 14:15
 */
public class GenerateJavaString {
    /**
     * 生成就我的java启动类源文件
     *
     * @param lineFeed              换行
     * @param myLauncherPackageName 包名
     * @param myLauncherName        类名
     * @param pluginPathProperty    jvm属性,获取工作路径
     * @param pluginPathName        插件文件夹名称
     * @param pluginPathNameProperty        插件文件夹名称属性
     * @return  java原文件的字符串表示
     */
    public static String generateMainJavaString(
            String lineFeed,
            String myLauncherPackageName,
            String myLauncherName,
            String pluginPathProperty,
            String pluginPathName,
            String pluginPathNameProperty
    ) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("package ").append(myLauncherPackageName).append(";")
                .append(lineFeed)
                .append(lineFeed).append("import org.springframework.boot.loader.JarLauncher;")
                .append(lineFeed)
                .append(lineFeed).append("import java.io.File;")
                .append(lineFeed).append("import java.net.URL;")
                .append(lineFeed)
                .append(lineFeed).append("/**")
                .append(lineFeed).append(" * Sakura插件生成的Springboot启动器")
                .append(lineFeed).append(" *")
                .append(lineFeed).append(" * @Author: sakura(插件作者)")
                .append(lineFeed).append(" * @Date: ").append(new Date())
                .append(lineFeed).append(" */")
                .append(lineFeed).append("public class ").append(myLauncherName).append(" extends JarLauncher {")
                .append(lineFeed).append("    // 查件的URL集合")
                .append(lineFeed).append("    private URL[] fileListUrls;")
                .append(lineFeed).append("    // 插件的File集合")
                .append(lineFeed).append("    private File[] fileList;")
                .append(lineFeed)
                .append(lineFeed).append("    public static void main(String[] args) throws Exception {")
                .append(lineFeed).append("        ").append(myLauncherName).append(" myLauncher").append(" = new ").append(myLauncherName).append("();")
                .append(lineFeed).append("        // 先从环境中获取插件项目所在目录")
                .append(lineFeed).append("        String property = System.getProperty(\"").append(pluginPathProperty).append("\");")
                .append(lineFeed).append("        if (property == null) {")
                .append(lineFeed).append("            // 获取当前jar的路径")
                .append(lineFeed).append("            property = System.getProperty(\"user.dir\");")
                .append(lineFeed).append("        }")
                .append(lineFeed).append("        // 先从环境中尝试获取插件文件夹名称")
                .append(lineFeed).append("        String pluginPathName = System.getProperty(\"").append(pluginPathNameProperty).append("\");")
                .append(lineFeed).append("        if (pluginPathName == null) {")
                .append(lineFeed).append("            // 编译器指定的插件名称")
                .append(lineFeed).append("            pluginPathName = \"").append(pluginPathName).append("\";")
                .append(lineFeed).append("        }")
                .append(lineFeed).append("        // 得到插件文件夹")
                .append(lineFeed).append("         File myPlugs = new File(new File(property), pluginPathName);")
                .append(lineFeed).append("         // 判断是否存在").append(pluginPathName).append("文件夹")
                .append(lineFeed).append("        if (myPlugs.exists()) {")
                .append(lineFeed).append("            myLauncher.fileList = myPlugs.listFiles((dir, name) -> name.endsWith(\".jar\"));")
                .append(lineFeed).append("        } else {")
                .append(lineFeed).append("            myLauncher.fileList = new File[0];")
                .append(lineFeed).append("        }")
                .append(lineFeed).append("        // 转换")
                .append(lineFeed).append("        myLauncher.fileListUrls = new URL[myLauncher.fileList.length];")
                .append(lineFeed).append("        for (int i = 0; i < myLauncher.fileList.length; i++) {")
                .append(lineFeed).append("            myLauncher.fileListUrls[i] = myLauncher.fileList[i].toURI().toURL();")
                .append(lineFeed).append("        }")
                .append(lineFeed).append("        myLauncher.launch(args);")
                .append(lineFeed).append("    }")
                .append(lineFeed)
                .append(lineFeed).append("    @Override")
                .append(lineFeed).append("    protected ClassLoader createClassLoader(URL[] urls) throws Exception {")
                .append(lineFeed).append("        // 准备数组")
                .append(lineFeed).append("        URL[] finalUrls = new URL[urls.length + fileListUrls.length];")
                .append(lineFeed).append("        // 复制")
                .append(lineFeed).append("        System.arraycopy(urls, 0, finalUrls, 0, urls.length);")
                .append(lineFeed).append("        System.arraycopy(fileListUrls, 0, finalUrls, urls.length, fileListUrls.length);")
                .append(lineFeed).append("        return super.createClassLoader(finalUrls);")
                .append(lineFeed).append("    }")
                .append(lineFeed).append("}")
                .append(lineFeed);
        return stringBuilder.toString();
    }
}
